home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CU Amiga Super CD-ROM 17
/
CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso
/
CUCD
/
Programming
/
DiceSource
/
src
/
dc1
/
stmt.h
< prev
next >
Wrap
Text File
|
1997-09-09
|
5KB
|
177 lines
/*
* DC1/STMT.H
*
* (c)Copyright 1992-1997 Obvious Implementations Corp. Redistribution and
* use is allowed under the terms of the DICE-LICENSE FILE,
* DICE-LICENSE.TXT.
*/
/*
** $Filename: stmt.h $
** $Author: dice $
** $Revision: 30.0 $
** $Date: 1994/06/10 18:04:57 $
** $Log: stmt.h,v $
* Revision 30.0 1994/06/10 18:04:57 dice
* .
*
* Revision 1.3 1993/09/19 13:03:16 jtoebes
* Fixed BUG00148 - Compiler does not catch gotos to non-existent label.
* Changed intermediate gotolabel information to know more about the label.
*
* Revision 1.2 1993/09/11 16:11:53 jtoebes
* Fixed BUG01010 - Code not allowed in switch statement before the first case.
* Added place in statement structure to hold the orphaned code.
*
**/
#define st_Func Hdr.Func
#define st_Tok Hdr.Tok
#define st_Next Hdr.Next
#define st_LexIdx Hdr.LexIdx
typedef struct StmtHdr {
void (*Func)(void *);
short Tok;
ubyte Reserved1;
ubyte Reserved2;
long LexIdx;
struct Stmt *Next;
} StmtHdr;
typedef struct Stmt {
StmtHdr Hdr;
} Stmt;
/*
* Sub statements. Note that labels are allocated at parse time whether or
* not they are used. Normally the statement generator will insert conditional
* branch nodes into the condition expressions and/or generate it's own
* expression to handle branch to the beginning of a loop, for example.
*/
typedef struct ExpStmt {
StmtHdr Hdr;
struct Exp *Expr;
} ExpStmt;
typedef struct DeclStmt {
StmtHdr Hdr;
struct Var *Var;
} DeclStmt;
typedef struct LabelStmt {
StmtHdr Hdr;
long Label;
Stmt *Stmt1; /* a: stmt, stmt is optional */
} LabelStmt;
typedef struct ForStmt {
StmtHdr Hdr;
struct BlockStmt *Block;
Stmt *Stmt0; /* available for initial jump */
Stmt *Stmt1; /* init */
Stmt *Stmt2; /* exp */
Stmt *Stmt3; /* stmt */
Stmt *Stmt4; /* code */
long LabelBegin;
} ForStmt;
typedef struct WhileStmt {
StmtHdr Hdr;
struct BlockStmt *Block;
Stmt *Stmt0; /* available for initial jump */
Stmt *Stmt1; /* really an exp */
Stmt *Stmt2; /* code */
} WhileStmt;
typedef struct DoStmt {
StmtHdr Hdr;
struct BlockStmt *Block;
Stmt *Stmt0; /* available for initial jump XXX */
Stmt *Stmt1; /* code */
Stmt *Stmt2; /* test */
} DoStmt;
typedef struct IfStmt {
StmtHdr Hdr;
Stmt *Stmt1; /* cond */
Stmt *StmtT; /* if true */
Stmt *StmtF; /* if false/NULL */
long LabelIf;
long LabelElse;
long LabelEnd;
} IfStmt;
/*
* Some confusion may occur as to why CaseAry and DefStmt pointer to a
* pointer to the statement. This occurs because at the time of the
* case or default label we do not yet have a statement list for it, but
* we DO have a pointer to where that statement list will begin.
*/
typedef struct SwitchStmt {
StmtHdr Hdr;
struct BlockStmt *Block;
Stmt *Stmt1; /* switch exp */
long NumCases; /* number of cases */
long DefCaseNo; /* default case insertion */
long *Cases; /* switch constants */
struct BlockStmt **CaseAry; /* cases for switch */
struct BlockStmt *DefBlock; /* case for default/NULL */
struct BlockStmt *BeforeBlock; /* Code which appears before any case */
long *Labels; /* label id's */
} SwitchStmt;
typedef struct ReturnStmt {
StmtHdr Hdr;
Stmt *Stmt1; /* return expression */
} ReturnStmt;
typedef struct BreakPointStmt {
StmtHdr Hdr;
} BreakPointStmt;
typedef struct GotoStmt {
StmtHdr Hdr;
SemInfo *GotoLabel;
} GotoStmt;
typedef struct ContinueStmt {
StmtHdr Hdr;
long ContLabel;
} ContinueStmt;
typedef struct BreakStmt {
StmtHdr Hdr;
long BreakLabel;
} BreakStmt;
#define BT_PROC 1
#define BT_BLOCK 2
#define BT_FOR 3
#define BT_WHILE 4
#define BT_DO 5
#define BT_SWITCH 6
typedef struct BlockStmt {
StmtHdr Hdr;
short Bid;
short Reserved1;
Frame Frame; /* allocation frame */
struct BlockStmt *Parent;
struct Var *VarBase; /* variables declared in block */
struct Var **LastVar;
struct Stmt *Base; /* first statement in list */
struct Stmt **Last; /* last statement in list */
long LabelLoop;
long LabelTest;
long LabelBreak;
long LastLexIdx; /* lexical index terminating block */
} BlockStmt;